<?php
/**
 * @date        <!-- phpDesigner :: Timestamp [08-07-2010 16:12:05] -->
 * @filesource  class.cms.php
 * @package     WebCms
 * @copyright	Copyright (C) 2010
 * @author      Sérgio 'Horizak' Alves
 */

// Sem acesso directo
defined('_WEXEC') or die('Restricted access');

/**
 * cms -  Class Principal
 *
 */
class cms {
  /**
   * Guarda as classes carregadas da aplicação
   */
  var $obj = array();

  /**
   * Guarda os modulos carregads da aplicação
   */
  var $mod = array();

  /**
   * Guarda a configuração da aplicação
   */
  var $cfg = array();

  /**
   * Guarda as globais POST GET SERVER da aplicação
   */
  var $global = array();

  /**
   * Guarda algo para incluir na aplicação
   * 
   */
  var $inc = array();

  /**
   * Carrega o component
   * 
   * @var           array $params - parâmetros opcionais
   */
  function _component($params = array()) {
    $get = cms_getGlobals('get');

    $component = isset($get['com']) ? $get['com'] : $this->cfg['site']['component'];

    $include = COM_P.cms_join_path($component,'component.'.$component.'.php');
    if (!include ($include)) cms_error(100,"Error load component ({$component}) : file component dont exist");
  }

  /**
   * Debug da aplicação
   * 
   * @var           boolean $get - retorna a array ou mostra o tpl do debug | definido: false
   * @var           array $params - parâmetros opcionais
   * @param         boolean $get - retornar ou mostrar
   */
  function _debug($get = false,$params = array()) {
    $this->_getLang('cms.debug');

    if ($this->cfg['site']['debug']) {
      global $errorHandler;

      if ($errorHandler) {
        if ($get === true) return $errorHandler;
        else {
          $this->_smartyAssign('errorHandler',$errorHandler);
          $this->_show('debug'.DS.'cms.debug.tpl');
        }
      }
    }
  }

  /**
   * Inclui o ficheiro de idioma
   * 
   * @var           string $name - nome do ficheiro do idioma
   * @var           array $params - parâmetros opcionais
   */
  function _getLang($name = '',$params = array()) {
    if (file_exists(LANG_P.$name.'.php')) include_once (LANG_P.$name.'.php');
    else  cms_error(100,"Language ({$name}.php) dont existes!");
  }

  /**
   * Passar metadata da aplicação
   * 
   * @var           bollean $show - mostra o metadata ou passa numa array
   * @var           array $params - parâmetros opcionais
   */
  function _getMetadata($show = false,$params = array()) {
    if (is_array($this->cfg['site']['metaData'])) {
      if ($show) {
        foreach ($this->cfg['site']['metaData'] as $k => $v) echo "  <meta name=\"{$k}\" content=\"{$v}\" />\n";
      } else  return $cms->cfg['site']['metaData'];
    } else  cms_error(100,"Metadata dont exist");
  }

  /**
   * Definir idioma
   * 
   * @var           array $params - parâmetros opcionais
   */
  function _lang($params = array()) {
    $userLang = isset($this->obj['user']) ? $this->obj['user']->getData('lang') : null;
    $cookieLang = isset($_COOKIE['siteLang']) ? $_COOKIE['siteLang'] : null;
    $cmsLang = $this->cfg['site']['lang'];

    if (isset($userLang)) $lang = $userLang;
    elseif (isset($cookieLang)) $lang = $cookieLang;
    else  $lang = $cmsLang;

    if (is_dir(LANGS_P.$lang.DS)) {
      define('LANG_P',LANGS_P.$lang.DS);
      define('LANG_U',LANGS_U."{$lang}/");
      $this->_set('cfg',array('site' => array('lang' => $lang)));
    } else {
      define('LANG_P',LANGS_P.'pt-PT'.DS);
      define('LANG_U',LANGS_U.'pt-PT/');
      $this->_set('cfg',array('site' => array('lang' => 'pt-PT')));
      cms_error(100,"Language ({$lang}) dont existes, loaded default language!");
    }

    $this->_getLang('cms');

    $this->_set('inc',array('langs' => cms_searchF(LANGS_P,false,'folders')));
  }

  /**
   * Carrega a class
   * 
   * @var           string $name - nome da class para carregar
   * @var           array $params - parâmetros opcionais
   * @param         string $name - nome para mostrar no $cms->obj['nome'] | definido: strtolower($name)
   * @param         string $file - ficheiro da class | definido: 'class.'.strtolower($name).'.php'
   * @param         string $dir - diretório da class | definido: LIB_P
   */
  function _load($name,$params = array()) {
    $nameShow = isset($params['name']) ? $params['name'] : strtolower($name);
    $file = isset($params['file']) ? $params['file'] : 'class.'.strtolower($name).'.php';
    $dir = isset($params['dir']) ? $params['dir'] : LIB_P;

    if ($name and is_file($dir.$file)) {
      require ($dir.$file);
      if (class_exists($name)) {
        $this->obj[$nameShow] = new $name;
        return true;
      } else {
        cms_error(100,"Error load ({$name}) : wrong name");
        return false;
      }
    } else {
      cms_error(100,"Error load ({$name}) : file don´t exists");
      return false;
    }
  }

  /**
   * Carrega o component
   * 
   * @var           string $component - nome do componente a carregar
   * @var           array $params - parâmetros opcionais
   */
  function _loadComponent($component,$params = array()) {
    $component = 'Component_'.$component;
    if (class_exists($component)) {
      $this->obj['component'] = new $component();
      return true;
    } else {
      cms_error(100,"Error load component ({$component}) : wrong component name");
      return false;
    }
  }

  /**
   * Carrega o modulo
   * 
   * @var           string $module - nome do modulo a carregar
   * @var           array $params - parâmetros opcionais
   * @param         string $name - nome para mostrar no $cms->mod['nome'] | definido: strtolower($module)
   */
  function _loadModule($module,$params = array()) {
    $name = isset($params['name']) ? $params['name'] : strtolower($module);
    $module = 'Module_'.$module;
    if (class_exists($module)) {
      $this->mod[$name] = new $module();
      return true;
    } else {
      cms_error(100,"Error load module ({$module}) : wrong module name");
      return false;
    }
  }

  /**
   * Pegar metadata da aplicação
   * 
   * @var           array $params - parâmetros opcionais
   */
  function _metaData($params = array()) {
    if ($this->obj['mysql']->getTotal("SELECT * FROM ".DBMETADATA." WHERE enabled = '1' ORDER BY ordering ASC")) {
      while ($row = mysql_fetch_array($this->obj['mysql']->result)) $metaData[$row['name']] = $row['value'];
      $this->_set('cfg',array('site' => array('metaData' => $metaData)));
    }
  }

  /**
   * Inclui os mods
   * 
   * @var           string $modulo - lado dos mods (Left/Right/nome do modulo) 
   * @var           array $params - parâmetros opcionais
   */
  function _module($module = '',$params = array()) {
    global $objSmarty;

    if ($module == 'Left' or $module == 'Right') $w = "position = '{$module}' AND enabled = '1'";
    else  $w = "name = '{$module}' AND position = 'Call' AND enabled = '1'";

    $query = "SELECT * FROM ".DBMODULES." WHERE $w ORDER BY ordering ASC";
    if ($this->obj['mysql']->getTotal($query,'modules')) {
      while ($row = mysql_fetch_array($this->obj['mysql']->modules)) {
        $include = MOD_P.cms_join_path(strtolower($row['name']),'module.'.strtolower($row['name']).'.php');
        if (file_exists($include)) include_once ($include);
        else  cms_error(100,"Module (module.{$row['name']}.php) dont existes!");
      }
    } else  cms_error(100,"No module returned for ({$module})");
  }

  /**
   * Passa as variaveis GET e POST
   * 
   * @var           array $params - parâmetros opcionais
   */
  function _parseGlobals($params = array()) {
    if (isset($_POST))
      foreach ($_POST as $k => $v) $this->global['post'][$k] = $v;
      else  $this->global['post'] = array();
    unset($k,$v);

    if (isset($_GET))
      foreach ($_GET as $k => $v) $this->global['get'][$k] = $v;
      else  $this->global['get'] = array();
    unset($k,$v);

    if (isset($_SERVER))
      foreach ($_SERVER as $k => $v) $this->global['server'][$k] = $v;
      else  $this->global['server'] = array();
    unset($k,$v);
  }

  /**
   * Coloca variaveis/configurações na aplicação
   * 
   * @var           string $key - index da variavel/configuração
   * @var           array $value - valor para atribuir
   * @var           boolean $change - alterar php/tpl ou ambos | opções: php/tpl/all | definido: php
   * @var           array $params - parâmetros opcionais
   */
  function _set($key,$value,$change = 'php',$params = array()) {
    global $objSmarty;

    if (!isset($this->$key)) $this->$key = '';
    if ($change == 'php' || $change == 'all') $this->$key = cms_arrayMerge($this->$key,$value);

    if ($change == 'tpl' || $change == 'all') {
      if (!isset($objSmarty->tpl_vars[$key])) $objSmarty->assign($key,array());
      $objSmarty->tpl_vars[$key]->value = cms_arrayMerge($objSmarty->tpl_vars[$key]->value,$value);
    }
  }

  /**
   * Mostra o tpl
   * 
   * @var           string $tpl - tpl para ser mostrado
   * @var           string $format - formato ficheiro tpl ou string
   * @var           string $get - mostra ou retorna o template
   * @var           array $params - parâmetros opcionais
   */
  function _show($tpl,$format = null,$get = null,$params = array()) {
    global $objSmarty;

    if (!is_null($get) and is_null($format)) return $objSmarty->fetch($tpl);
    elseif (!is_null($get) and $format == 'string') return $objSmarty->fetch("string:$tpl");
    elseif (is_null($get) and $format == 'string') $objSmarty->display("string:$tpl");
    else  $objSmarty->display($tpl);
  }

  /**
   * Mostra o tpl
   * 
   * @var           string $value - Texto com o erro
   * @var           array $params - parâmetros opcionais
   */
  function _showError($value,$params = array()) {
    $this->_smartyAssign('showError',$value);
    $tpl = 'cms.showerror.tpl';
    $this->obj['component']->show = $this->_show($tpl,null,true);
  }

  /**
   * Passa uma variavel para o smarty
   * 
   * @var           string $name - nome da variavel 
   * @var           string $value - valor da variavel
   * @var           array $params - parâmetros opcionais
   */
  function _smartyAssign($name,$value,$params = array()) {
    global $objSmarty;

    $objSmarty->assign($name,$value);
  }

  /**
   * Definir o template
   * 
   * @var           string $template - nome do template | definido: default
   * @var           array $params - parâmetros opcionais
   */
  function _template($template = 'default',$params = array()) {
    global $objSmarty;
    if (!is_dir(TPLS_P.$template)) {
      cms_error(100,"Template ({$template}) dont existes, loaded default template!");
      $this->_set('cfg',array('site' => array('template' => 'default')));
      $template = 'default';
    }

    define('TPL_P',TPLS_P.$template.DS);
    define('TPL_U',TPLS_U.$template.'/');
    define('TPLCOMPONENT_P',TPL_P.'components'.DS);
    define('TPLCOMPONENT_U',TPL_U.'components/');
    define('TPLCSS_P',TPL_P.'css'.DS);
    define('TPLCSS_U',TPL_U.'css/');
    define('TPLIMG_P',TPL_P.'images'.DS);
    define('TPLIMG_U',TPL_U.'images/');
    define('TPLMODULE_P',TPL_P.'modules'.DS);
    define('TPLMODULE_U',TPL_U.'modules/');
    define('TPLPHP_P',TPL_P.'php'.DS);
    define('TPLPHP_U',TPL_U.'php/');
    $objSmarty->addTemplateDir(TPL_P);
    $objSmarty->addTemplateDir(STPLS_P);
  }
}

// Inicia a class
$cms = new cms;
if (isset($cfg)) $cms->_set('cfg',$cfg);
if (isset($global)) $cms->_set('global',$global);
unset($cfg,$global);
?>